const userService = require('../services/userService');
const { successWithData, error } = require('../utils/resultwrapper');
const svgCaptcha = require('svg-captcha');
const redisUtils = require('../utils/redisUtils');
const { v4: uuidv4 } = require('uuid');

// 验证码过期时间（秒）
const CAPTCHA_EXPIRE = 300; // 5分钟

class AuthController {
    // 生成验证码
    async getCaptcha(req, res) {
        try {
            // 创建验证码
            const captcha = svgCaptcha.create({
                size: 4, // 验证码长度
                ignoreChars: '0o1il', // 排除容易混淆的字符
                noise: 2, // 干扰线条数量
                color: true, // 验证码颜色
                background: '#f0f0f0' // 背景色
            });
            
            // 生成唯一的验证码ID
            const captchaKey  = uuidv4();
            
            // 将验证码文本存储在Redis中，并设置过期时间
            await redisUtils.set(`captcha:${captchaKey }`, captcha.text.toLowerCase(), CAPTCHA_EXPIRE);
            
            const base64 = `data:image/svg+xml;base64,${Buffer.from(captcha.data).toString('base64')}`;
            // 返回验证码图片和ID
            res.json(successWithData({
                captchaBase64: base64,
                captchaKey: captchaKey ,
            }));
        } catch (err) {
            res.json(error(err.message));
        }
    }
    
    // 用户登录
    async login(req, res) {
        try {
            const { username, password, captchaCode, captchaKey } = req.body;
        
            // 从Redis获取验证码
            const redisCaptcha = await redisUtils.get(`captcha:${captchaKey}`);
            
            // 验证码校验
            if (!redisCaptcha || redisCaptcha !== captchaCode.toLowerCase()) {
                return res.json(error('验证码错误或已过期'));
            }
            
            // 验证通过后删除Redis中的验证码，防止重复使用
            await redisUtils.del(`captcha:${captchaKey}`);

            const result = await userService.login(username, password);
            
            // 设置token到cookie
            if (result && result.token) {
                res.cookie('node-gis-admin-token', result.token, {
                    httpOnly: true, // 防止客户端脚本访问
                    secure: process.env.NODE_ENV === 'production', // 在生产环境中只通过HTTPS发送
                    maxAge: 24 * 60 * 60 * 1000, // 24小时过期
                    sameSite: 'strict' // 防止CSRF攻击
                });
            }

            res.json(successWithData(result));
        } catch (err) {
            res.json(error(err.message));
        }
    }
}

module.exports = new AuthController();